﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using ToyStore.Domain.Common;
using ToyStore.Domain.Store;

namespace ToyStore.Domain.System
{
	/// <summary>
	/// Klasa reprezentująca użytkownika systemu.
	/// </summary>
	[DisplayName("Użytkownik")]
	public class User : BaseEntity
	{
		/// <summary>
		/// Konstruktor.
		/// </summary>
		public User()
		{
			Orders = new List<Order>();
			Roles = new List<Role>();
		}

		/// <summary>
		/// Login do systemu.
		/// </summary>
		[Required(ErrorMessage = "Musisz podać nazwę użytkownika")]
		[DisplayName("User name")]
		[StringLength(50)]
		[RegularExpression(RegularExpression.UserName, ErrorMessage = "Nazwa użytkownika zawiera niedozwolone znaki")]
		//[Remote("UserNameAvailable", "Users", AdditionalFields = "Id")]
		public virtual string UserName { get; set; }

		/// <summary>
		/// Imię.
		/// </summary>
		[Required(ErrorMessage = "Musisz podać imię")]
		[DisplayName("Imię")]
		public virtual string FirstName { get; set; }

		/// <summary>
		/// Nazwisko.
		/// </summary>
		[Required(ErrorMessage = "Musisz podać nazwisko")]
		[DisplayName("Nazwisko")]
		public virtual string Surname { get; set; }

		/// <summary>
		/// Hasło.
		/// </summary>
		[DisplayName("Hasło")]
		public virtual string Password { get; set; }

		/// <summary>
		/// Adres email.
		/// </summary>
		[DisplayName("Email")]
		[RegularExpression(RegularExpression.Email, ErrorMessage = "Niepoprawny format adresu email")]
		[Required(ErrorMessage = "Musisz podać adres email")]
		public virtual string Email { get; set; }

		/// <summary>
		/// Guid odzyskiwania hasła.
		/// </summary>
		[DisplayName("Guid przywracania hasła")]
		public virtual Guid? PasswordRecoveryGuid { get; set; }

		/// <summary>
		/// Lista zamówień użytkownika.
		/// </summary>
		[DisplayName("Zamówienia")]
		public virtual IList<Order> Orders { get; set; }

		/// <summary>
		/// Kontrahent.
		/// </summary>
		[DisplayName("Kontrahent")]
		public virtual Contractor Contractor { get; set; }

		/// <summary>
		/// Role użytkownika.
		/// </summary>
		[DisplayName("Role")]
		public virtual IList<Role> Roles { get; set; }

			/// <summary>
		/// Pełna nazwa użytkownika.
		/// </summary>
		[DisplayName("Imię i nazwisko")]
		public virtual string FullName
		{
			get { return string.Format("{0} {1}", FirstName, Surname); }
		}

		/// <summary>
		/// Pobiera role użytkownika.
		/// </summary>
		/// <returns></returns>
		public virtual HashSet<EnumRole> GetRolesSet()
		{
			var result = new HashSet<EnumRole>();
			foreach (Role role in Roles)
			{
				if (!result.Contains(role.SystemEnumRole))
					result.Add(role.SystemEnumRole);
			}

			return result;
		}
	}
}